/**
 * Global variables header
 * (C) Nettle developers 2000-2002
 *
 * $Id: globals,v 1.89 2004/04/02 06:32:00 archifishal Exp $
 */

#ifndef GLOBALS_H
#define GLOBALS_H

#include "nettle.h"
#include "dnslib.h"

/**** GLOBAL DEFAULT/OPTIONS ***************/

#define APPLICATION_NAME        "Nettle"
#define APPLICATION_ICON_NAME   "!nettle"

#define ZAP_FONT                "08x16"
#define ZAP_LOWRES_FONT         "08x08"

#define LINE_EDITOR_SIZE        32
#define TERMINAL_WIDTH          80
#define TERMINAL_HEIGHT         24
#define SCROLLBACK_LINES        96

#define TERMINAL_SPEED          38400

#define MAX_LINE_EDITOR_SIZE    255
#define MIN_TERMINAL_WIDTH      8
#define MAX_TERMINAL_WIDTH      256
#define MIN_TERMINAL_HEIGHT     4
#define MAX_TERMINAL_HEIGHT     128
#define MAX_SCROLLBACK_SIZE     (1<<16)

#define NO_OF_TERMINAL_TYPES    10

#define LOGGING                 false
#define LINE_EDITOR             0
#define PASS_F12                false
#define BLINKING                true
#define DONT_REQUIRE_CTRL       false
#define SCROLL_ON_KEYPRESS      false

#define CURSOR_BLINK            false
#define CURSOR_BLINK_DELAY      50

#define CHOICES_VERSION_KNOWN   1
/*******************************************/

#define NETTLE_HOME_PAGE        "http://nettle.sourceforge.net/"

#define MAX_TAB_NUMBER		32

#define MAX_LINEEDITOR_LENGTH   512

#define min(x,y) ((x)<(y)?(x):(y))
#define max(x,y) ((x)>(y)?(x):(y))

struct term_char
{
  char fg, bg, flags, chr;
};

extern const char *application_name;
extern const char *application_icon_name;
extern bool quit_flag;

extern char zap_font[256];
extern char zap_lowres_font[256];

extern int *zap_font_area;
extern int *zap_lowres_font_area;
extern struct zapredraw_block redraw;

extern int *zapredraw_area;
extern int zapredraw_area_number;
extern int size_of_zapredraw_area;

extern colour_t palette[16];
extern const colour_t default_palette[16];

extern struct os_spriteop_area *sprite_area;

extern struct coords eig, screensize;
extern int toolheight;
/* This would be 'nice' to fill-out, but really annoying to do for OS < 3.8 */
/* extern struct wimp_gadgetsizes gadgetsizes; */

extern int task_handle;
extern int wimp_version;
extern int iconbar_handle;
extern int menu_window, menu_icon; /* for use with the currently-open menu */
extern int colourpicker_handle;
extern int drag_window_handle;

extern int win_info;
extern int win_choices;
extern int win_paneterm;
extern int win_panecols;
extern int win_panehot;
extern int win_hotpane;
extern int win_hotedit;
extern int win_panemisc;
extern int win_open;
extern int win_resize;
extern int win_save;
extern int win_spoolsave;
extern int win_sizebar;
extern int win_termterm;

extern int menu_open;
extern int resize_handle;

extern int choices_file_version_number;
extern bool logging;
extern char line_editor;
extern bool pass_f12;
extern bool cursor_blink;
extern bool blinking;
extern bool want_blink;
extern bool dont_require_ctrl;
extern bool scroll_on_keypress;

extern int line_editor_size;
extern enum nettle_terminal default_terminal;
extern struct coords defaultsize;
extern int defaultscroll;

struct paste_buffer
{
  struct paste_buffer *next;
  int length;
  char data[1]; /* malloc'ed appropriately */
};

typedef enum {
  cursor_solid,
  cursor_underline
} cursor_t;

extern cursor_t cursor_type;

struct session_struct
{
  struct session_struct *next;	/* next session in linked list */
  struct session_struct *prev;	/* previous session in linked list */
  int window_handle;		/* window handle */
  int pane_handle;		/* pane window handle */

  struct term_char **assigned_area;  /* pointer to list of pointers for each line in terminal */
  struct term_char **alternate_area; /* ditto, alternate (no scrollback) */
  char *line_flags;             /* array of flags for each line, whether line has wrapped or not */
  char *alternate_line_flags;   /* ditto for alternate screen */

  enum nettle_terminal terminal_type; /* terminal type */
  struct coords pos;		/* current position */
  struct coords terminal_size;	/* size of terminal */
  int scrollback;		/* size of scrollback */
  int socket_handle;		/* socket handle (or task handle etc.) */
  char socket_host[256];	/* hostname */
  int socket_port;		/* port number */
  unsigned int socket_ip;	/* IP */
  dns_t *dns;                   /* handle for dns lookup */
  char socket_state;		/* state of socket (see nettle.h for states) */
  char current_fg;		/* current foreground colour */
  char current_bg;		/* current background colour */
  int current_flags;		/* current flags */
  char *title;			/* titlebar contents */
  char *icon_name;              /* icon contents (when pinned) */
  char label[150];              /* Menu label (hostname/command/hotlist label) */
  char escape_string[256];	/* Escape array */
  int escape_string_length;	/* length of escape array so far */
  unsigned char escape_state;	/* escape state (see nettle.h for states) */
  bool session_flags[256];	/* session flags (same as telnet options so far) */
  bool local_echo;		/* true if we're doing local echo */
  int scroll_start;		/* start of scroll area */
  int scroll_end;		/* end of scroll area */
  int other_session_flags;	/* other session flags (see nettle.h) */
  char connection_type;		/* connection type: telnet, ssh, etc. */
  bool want_blink;              /* Do we want to be redrawn every 50cs? */

  bool cursor_saved;            /* are cursor settings saved? */
  bool position_saved;          /* is the cursor position saved? */
  struct coords old_pos;	/* old position */
  char old_current_fg;		/* old fg colour */
  char old_current_bg;		/* old bg colour */
  int old_current_flags;	/* old current flags */
  int old_other_session_flags;  /* old other session flags */
  int old_character_set_gl;	/* old character set GL */
  int old_character_set_gr;     /* old character set GR */
  int old_character_set_g0;	/* old character set G0 */
  int old_character_set_g1;	/* old character set G1 */
  int old_character_set_g2;	/* old character set G2 */
  int old_character_set_g3;	/* old character set G3 */

  int terminal_mode;            /* terminal mode */
  bool bit_controls;            /* bit controls (false = 7-bit, true = 8-bit) */
  char line_editor_type;        /* line editor type */
  char *line_editor_history;    /* line editor history */
  int line_editor_position;	/* current position in the line editor */
  int line_editor_total;	/* total number of items in the history */
  char line_editor_buffer[MAX_LINEEDITOR_LENGTH]; /* line editor buffer */

  int character_set_gl;		/* currently selected character set GL */
  int character_set_gr;         /* currently selected character set GR */
  int character_set_g0;	        /* character set G0 */
  int character_set_g1;	        /* character set G1 */
  int character_set_g2;	        /* character set G2 */
  int character_set_g3;	        /* character set G3 */

  int tabs[MAX_TAB_NUMBER];	/* tab positions */
  int number_of_tabs;		/* number of tabs */

  char *spool_file_name;        /* pointer to spool filename */
  FILE *spool_file_handle;      /* spool file handle */
  bool spool_raw;               /* Whether we're writing raw data to spool or not */
  int spool_time;               /* Time of last spool */

  bool mouse_terminal_attached; /* Whether the mouse is attached to the terminal or not */
  char mouse_mode;              /* The type of the mouse connection - eg. click, click/release */

  struct paste_buffer *paste;   /* paste buffer(s): e.g. from file */
  struct paste_buffer *paste_head; /* the most recent paste buffer */

  bool window_needs_resized;    /* Window needs resized after a mode change */

  /* Auto-login details for telnet/ssh/rsh */
  char *login_user;             /* Login user name */
  char *login_pass;             /* Login password */

  /* These functions will be NULL if no processing is necessary */
  void (*login_data)(struct session_struct *session,char c);
                                /* Function called to reset the login
                                   information at a break point */
  int login_index;              /* Index into login details we're at */
  char *login_match;            /* The match we're looking for */
};

extern struct session_struct *sessions;

extern bool selection_in_progress;
extern struct session_struct *selection_session;
extern int selection_start;
extern int selection_end;
extern int selection_adjust_dragging;

extern bool we_own_clipboard;

extern const struct session_struct *cursor_session;
extern int nextcursortime;
extern bool cursor_state;
extern colour_t zap_palette[16];

extern struct session_struct *terminal_menu_session;

extern struct session_struct *mouse_handling_session;

extern struct session_struct *options_session;

extern const char terminal_name[NO_OF_TERMINAL_TYPES][MESSAGE_MAX_TERMINAL];

typedef struct user_message
{
  int length;
  int sender_ref;
  int my_ref;
  int your_ref;
  int message_code;

  union
  {
    char bytes[236];

    struct
    {
      int window_handle;
      int icon_handle;
      struct coords pos;
      int size;
      int filetype;
      char file_name[212];
    } data_save, data_save_ack, data_load;

    struct
    {
      int shutdown_flag;
    } prequit;

    struct
    {
      int flags;
    } clip_claimentity;

    struct
    {
      int window_handle;
      int internal_handle;
      struct coords pos;
      int opcode;
      int types[54];
    } clip_datarequest;

    struct
    {
      int submenu;
      struct coords pos;
      int selection[56];
    } menu_warning;

    struct
    {
      int window_handle;
      int reserved;
      char icon_string[8];
      char title[220];
    } window_info;

    struct
    {
      int picker_handle;
      int flags;
      colour_t colour;
      /* extension data - ignored */
    } colourpicker_choice;

    struct
    {
      int picker_handle;
    } colourpicker_close;

    struct
    {
      int size;
      char data[232];
    } task_window_input;

    struct
    {
      int size;
      char data[232];
    } task_window_output;

    struct
    {
      int txt_handle;
    } task_window_ego;

  } contents;

} user_message;



union wimp_poll_block
{
  struct
  {
    int window_handle;
  } redraw_window;

  struct
  {
    int window_handle;
    struct coords min;
    struct coords max;
    struct coords scroll;
    int handle_behind;
  } open_window;

  struct
  {
    int window_handle;
  } close_window;

  struct
  {
    int window_handle;
  } pointer_leaving_window;

  struct
  {
    int window_handle;
  } pointer_entering_window;

  struct
  {
    struct coords pos;
    int buttons;
    int window_handle;
    int icon_handle;
  } mouse_click;

  struct
  {
    struct coords min;
    struct coords max;
  } user_drag_box;

  struct
  {
    int window_handle;
    int icon_handle;
    struct coords pos;
    int height_and_flags;
    int index;
    int code;
    int extra;
  } key_pressed;

  struct
  {
    int menu[64];
  } menu_selection;

  struct
  {
    int window_handle;
    struct coords min;
    struct coords max;
    struct coords scroll;
    int handle_behind;
    struct coords scroll_dir;
  } scroll_request;

  struct
  {
    int window_handle;
    int icon_handle;
    struct coords pos;
    int height_and_flags;
    int index;
  } caret;

  struct
  {
    int *address_poll_word;
    int contents_poll_word;
  } pollword_non_zero;

  user_message user_message;
};

#endif
